package com.cz.video.common.vod.service;

import com.cz.video.common.exception.VodException;
import com.cz.video.common.vod.dto.VodUploadAuth;
import com.cz.video.common.vod.VodProvider;
import com.cz.video.common.vod.dto.VideoInfo;
import com.cz.video.common.vod.dto.VodMetaInfo;
import com.cz.video.common.vod.dto.VodPlayAuth;
import com.cz.video.common.vod.properties.VodProperties;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.DisposableBean;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;


/**
 * 用来处理vod，对接多个平台
 */
@Slf4j
@Getter
@Setter
public class VodService implements DisposableBean {

    private CopyOnWriteArrayList<VodProvider> vodList;
    private VodProperties properties;

    private VodService self;


    /**
     * 获取默认的存储平台
     */
    public VodProvider getVodProvider() {
        return getVodProvider(properties.getDefaultPlatform());
    }

    /**
     * 获取对应的cod平台
     */
    public VodProvider getVodProvider(String platform) {
        for (VodProvider vod : vodList) {
            if (vod.getPlatform().equals(platform)) {
                return vod;
            }
        }
        return null;
    }

    /**
     * 获取对应的vod平台，如果存储平台不存在则抛出异常
     */
    public VodProvider getVodProviderVerify(String platform) {
        VodProvider vod = getVodProvider(platform);
        if (vod == null) throw new VodException("没有找到对应的vod平台！");
        return vod;
    }

    /**
     * 创建上传视频权限
     * @param name 资源名
     * @param fileName 上传文件名
     * @return 上传视频凭证
     */
    public VodUploadAuth createUploadVideo(String name, String fileName){
        VodProvider vodProvider = getVodProvider();
        VodUploadAuth auth = vodProvider.createUploadVideo(name, fileName);
        auth.setService(vodProvider.getService());
        return auth;
    }

    /**
     * 得到 播放凭证
     * @param vid 视频id
     * @return 播放凭证
     */
    public VodPlayAuth getVideoPlayAuth(String vid){
        return getVodProvider().getVideoPlayAuth(vid);
    }


    /**
     * 刷新上传凭证
     * @param vid 视频id
     * @return 上传凭证
     */
    public VodUploadAuth refreshUploadAuth(String vid){
    return getVodProvider().refreshUploadAuth(vid);
  }

    /**
     * 校验回调 是否合法
     *
     * @param request 回调请求
     */
    public void checkCallbackValid(HttpServletRequest request){
        if (!getVodProvider().checkCallbackValid(request))throw new VodException("vod回调不合法");
    }



    @Override
    public void destroy() {
        for (VodProvider vod : vodList) {
            try {
                vod.close();
                log.info("销毁存储平台 {} 成功",vod.getPlatform());
            } catch (Exception e) {
                log.error("销毁存储平台 {} 失败，{}",vod.getPlatform(),e.getMessage(),e);
            }
        }
    }

    public VodMetaInfo getMetaInfoByVid(String videoId) {
        return getVodProvider().getMetaInfoByVid(videoId);
    }

    public VideoInfo getVideoInfoByVid(String videoId) {
        return getVodProvider().getVideoInfoByVid(videoId);
    }

    /**
     * 批量获取视频信息
     * @param vidList
     * @return
     */
    public List<VideoInfo> getVideoInfoList(List<String> vidList) {
        return getVodProvider().getVideoInfoList(vidList);
    }
}
